import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers";
import { fixturesByUrl } from "discourse/tests/helpers/create-pretender";
import { test } from "qunit";
import { click, visit } from "@ember/test-helpers";

acceptance("Discourse Solved Plugin", function (needs) {
  needs.user();

  needs.pretender((server, helper) => {
    const postStreamWithAcceptedAnswerExcerpt = (excerpt) => {
      return {
        post_stream: {
          posts: [
            {
              id: 21,
              name: null,
              username: "kzh",
              avatar_template:
                "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
              created_at: "2017-08-08T20:11:32.542Z",
              cooked: "<p>How do I declare a variable in ruby?</p>",
              post_number: 1,
              post_type: 1,
              updated_at: "2017-08-08T21:03:30.521Z",
              reply_count: 0,
              reply_to_post_number: null,
              quote_count: 0,
              avg_time: null,
              incoming_link_count: 0,
              reads: 1,
              score: 0,
              yours: true,
              topic_id: 23,
              topic_slug: "test-solved",
              display_username: null,
              primary_group_name: null,
              primary_group_flair_url: null,
              primary_group_flair_bg_color: null,
              primary_group_flair_color: null,
              version: 2,
              can_edit: true,
              can_delete: false,
              can_recover: null,
              can_wiki: true,
              read: true,
              user_title: null,
              actions_summary: [
                { id: 3, can_act: true },
                { id: 4, can_act: true },
                { id: 5, hidden: true, can_act: true },
                { id: 7, can_act: true },
                { id: 8, can_act: true },
              ],
              moderator: false,
              admin: true,
              staff: true,
              user_id: 1,
              hidden: false,
              hidden_reason_id: null,
              trust_level: 4,
              deleted_at: null,
              user_deleted: false,
              edit_reason: null,
              can_view_edit_history: true,
              wiki: false,
              can_accept_answer: false,
              can_unaccept_answer: false,
              accepted_answer: false,
            },
            {
              id: 22,
              name: null,
              username: "kzh",
              avatar_template:
                "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
              created_at: "2017-08-08T20:12:04.657Z",
              cooked:
                "<p>this is a long answer that potentially solves the question</p>",
              post_number: 2,
              post_type: 1,
              updated_at: "2017-08-08T21:20:24.417Z",
              reply_count: 0,
              reply_to_post_number: null,
              quote_count: 0,
              avg_time: null,
              incoming_link_count: 0,
              reads: 1,
              score: 0,
              yours: true,
              topic_id: 23,
              topic_slug: "test-solved",
              display_username: null,
              primary_group_name: null,
              primary_group_flair_url: null,
              primary_group_flair_bg_color: null,
              primary_group_flair_color: null,
              version: 2,
              can_edit: true,
              can_delete: true,
              can_recover: null,
              can_wiki: true,
              read: true,
              user_title: null,
              actions_summary: [
                { id: 3, can_act: true },
                { id: 4, can_act: true },
                { id: 5, hidden: true, can_act: true },
                { id: 7, can_act: true },
                { id: 8, can_act: true },
              ],
              moderator: false,
              admin: true,
              staff: true,
              user_id: 1,
              hidden: false,
              hidden_reason_id: null,
              trust_level: 4,
              deleted_at: null,
              user_deleted: false,
              edit_reason: null,
              can_view_edit_history: true,
              wiki: false,
              can_accept_answer: false,
              can_unaccept_answer: true,
              accepted_answer: true,
            },
          ],
          stream: [21, 22],
        },
        timeline_lookup: [[1, 0]],
        id: 23,
        title: "Test solved",
        fancy_title: "Test solved",
        posts_count: 2,
        created_at: "2017-08-08T20:11:32.098Z",
        views: 6,
        reply_count: 0,
        participant_count: 1,
        like_count: 0,
        last_posted_at: "2017-08-08T20:12:04.657Z",
        visible: true,
        closed: false,
        archived: false,
        has_summary: false,
        archetype: "regular",
        slug: "test-solved",
        category_id: 1,
        word_count: 18,
        deleted_at: null,
        pending_posts_count: 0,
        user_id: 1,
        pm_with_non_human_user: false,
        draft: null,
        draft_key: "topic_23",
        draft_sequence: 6,
        posted: true,
        unpinned: null,
        pinned_globally: false,
        pinned: false,
        pinned_at: null,
        pinned_until: null,
        details: {
          created_by: {
            id: 1,
            username: "kzh",
            avatar_template:
              "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
          },
          last_poster: {
            id: 1,
            username: "kzh",
            avatar_template:
              "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
          },
          participants: [
            {
              id: 1,
              username: "kzh",
              avatar_template:
                "/letter_avatar_proxy/v2/letter/k/ac91a4/{size}.png",
              post_count: 2,
              primary_group_name: null,
              primary_group_flair_url: null,
              primary_group_flair_color: null,
              primary_group_flair_bg_color: null,
            },
          ],
          notification_level: 3,
          notifications_reason_id: 1,
          can_move_posts: true,
          can_edit: true,
          can_delete: true,
          can_remove_allowed_users: true,
          can_invite_to: true,
          can_invite_via_email: true,
          can_create_post: true,
          can_reply_as_new_topic: true,
          can_flag_topic: true,
        },
        highest_post_number: 2,
        last_read_post_number: 2,
        last_read_post_id: 22,
        deleted_by: null,
        has_deleted: false,
        actions_summary: [
          { id: 4, count: 0, hidden: false, can_act: true },
          { id: 7, count: 0, hidden: false, can_act: true },
          { id: 8, count: 0, hidden: false, can_act: true },
        ],
        chunk_size: 20,
        bookmarked: false,
        tags: [],
        featured_link: null,
        topic_timer: null,
        message_bus_last_id: 0,
        accepted_answer: { post_number: 2, username: "kzh", excerpt: excerpt },
      };
    };

    server.get("/t/11.json", () => {
      return helper.response(
        postStreamWithAcceptedAnswerExcerpt("this is an excerpt")
      );
    });

    server.get("/t/12.json", () => {
      return helper.response(postStreamWithAcceptedAnswerExcerpt(null));
    });

    server.get("/search", () => {
      const fixtures = Object.assign({}, fixturesByUrl["/search.json"]);
      fixtures.topics[0].has_accepted_answer = true;
      return helper.response(fixtures);
    });
  });

  test("A topic with an accepted answer shows an excerpt of the answer, if provided", async function (assert) {
    await visit("/t/with-excerpt/11");

    assert.ok(
      queryAll('.quote blockquote:contains("this is an excerpt")').length === 1
    );

    await visit("/t/without-excerpt/12");

    assert.notOk(queryAll(".quote blockquote").length === 1);
    assert.ok(queryAll(".quote .title.title-only").length === 1);
  });

  test("Full page search displays solved status", async function (assert) {
    await visit("/search");

    await fillIn(".search-query", "discourse");
    await click(".search-cta");

    assert.ok(queryAll(".fps-topic").length === 1, "has one post");

    assert.ok(queryAll(".topic-status .solved").length, "shows the right icon");
  });
});
